#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <dirent.h>
#include <string.h>
#include <time.h>
#include <grp.h>
#include <pwd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/select.h>
#include <sys/time.h>
#include <sys/wait.h>
#include <strings.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <sys/msg.h>
#include <signal.h>
#include <pthread.h>
#include <errno.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/epoll.h>
#include <sys/sendfile.h>
#define ARGS_CHECK(argc,num) {if(argc!=num) {printf("wrong args\n"); return -1;}}
#define ERROR_CHECK(ret,retval,func_name) {if(ret==retval) {printf("errno=%d\n",errno);fflush(stdout);perror(func_name);return -1;}}
#define SELFFUNC_ERROR_CHECK(ret,func_name) {if(ret!=0) {printf("%s failed\n",func_name);return -1;}}
#define THREAD_ERROR_CHECK(ret,func_name) {if(ret!=0) {printf("%s failed,%d %s\n",func_name,ret,strerror(ret));return -1;}}

#define Num 1024
typedef struct{
    int fd;//给子进程用于通信的描述符
}child_use,*pchild_use;

//不要交换data_len和buf的定义顺序
typedef struct{
    int data_len;//存放buf，也就是火车车厢中数据长度
    char buf[Num];//火车车厢长度
}train_t;

//拿描述符与服务器端通信
int socket_client(char* ip,char* port);
//客户端用于通信主函数
void client_handle(int fd);
//循环接收，直至接收长度到达len
int recvn(int fd_recv,char* recv_buf, int len);
//循环发送，直至发送长度到达len
int sendn(int fd_send,char* send_buf,int len);
//给服务器端上传文件
int upload(int fd_up,char* file_name);
//下载文件
int download(int fd_down,char* file_name);
//循环读取要发给服务器端的文件,配合upload函数使用
int readn(int fd_read,char* read_buf,int len);
//循环写入从服务器端接收到的文件内容到客户端，配合download函数使用
int writen(int fd_write,char* write_buf,int len);
